﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Protocolo.Enums;
using Protocolo.Mensajes.Response;
using Protocolo.AnchoDeBanda;

namespace Protocolo.Mensajes.Request
{
    public class SubirArchivoRequest : MensajeBase
    {
        protected override string Datos
        {
            get
            {
                return NombreArchivo.PadLeft(50) + MD5.PadLeft(32) + LargoArchivo.ToString();
            }
            set
            {
                NombreArchivo = value.Substring(0, 50).Trim();
                MD5 = value.Substring(50, 32).Trim();
                LargoArchivo = long.Parse(value.Substring(82).Trim());
            }
        }

        public string NombreArchivo { get; set; }
        public string MD5 { get; set; }
        public long LargoArchivo { get; set; }
        public byte[] Archivo { get; set; }

        public SubirArchivoRequest()
        {
            this.Header = TipoMensajeEnum.REQ;
            this.Cmd = ComandoEnum.SubirArchivo;
        }

        public SubirArchivoResponse EnviarArchivo(string ip, int puerto, AnchoDeBandaServidor anchoDeBandaServidor)
        {
            var comunicacionTCP = new ComunicacionTCP();
            try
            {
                //Abro la conexion
                comunicacionTCP.ConectarCliente(ip, puerto);

                SubirArchivoResponse response;

                //Envio mensaje pidiendo subir archivo
                comunicacionTCP.EnviarMensaje(this);

                //Recibo respuesta
                response = (SubirArchivoResponse)comunicacionTCP.RecibirMensaje();

                if (response.Resultado != ResultadoTransferenciaArchivoEnum.OK)
                    return response;

                //Envio el archivo
                comunicacionTCP.EnviarArchivo(this.Archivo, anchoDeBandaServidor);

                //Recibo respuesta
                response = (SubirArchivoResponse)comunicacionTCP.RecibirMensaje();

                return response;
            }
            catch (Exception ex)
            {
                throw new Exception("Error enviando mensaje " + ex.Message);
            }
            finally
            {
                comunicacionTCP.CerrarConexion();
            }
        }
    }
}
